package com.weeego.util.image;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 *
 * @author Administrator
 */
public class ImgManager1 {

    public static void main(String args[]) throws IOException {
        // ImgManager1.reduceImg("i:/e/500344090.jpg", "i:/e/t/1.jpg", 160, 110);

        //转换格式
        //ImgManager1.writeJPEGImage((RenderedImage) (ImgManager1.readImage("i:/e/2008111775449077801.gif")), "i:/e/t/temp_1.jpg");
        //缩放
        // ImgManager1.reduceImg("i:/e/t/temp_1.jpg", "i:/e/t/1.jpg", 160, 110);

        ImgManager1.resize_scale("i:/e/2008111775449077801.gif", "i:/e/t/11.jpg", 160, 110);


    }

    /**
     * 图片等比缩放
     *
     * @param oldfileurl
     *            旧的文件
     * @param newfileurl
     *            新的文件
     * @param whith
     *            新文件的宽
     * @param hight
     *            新文件的高
     * @throws IOException
     *             异常
     */
    public static void resize_scale(String oldfileurl, String newfileurl,
            int whith, int hight) throws IOException {
        ImgManager1.writeJPEGImage((RenderedImage) (ImgManager1.readImage(oldfileurl)), oldfileurl + ".jpg");

        oldfileurl = oldfileurl + ".jpg";

        BufferedImage srcImage;
        File fromFile = new File(oldfileurl);
        srcImage = ImageIO.read(fromFile);
        if (srcImage.getWidth() > whith || srcImage.getHeight() > hight) {

            if (srcImage.getWidth() / whith > srcImage.getHeight() / hight) {

                reduceImg(oldfileurl, newfileurl, whith, whith * srcImage.getHeight() / srcImage.getWidth());
            } else {
                reduceImg(oldfileurl, newfileurl, hight * srcImage.getWidth() / srcImage.getHeight(), hight);
            }
        } else {
            reduceImg(oldfileurl, newfileurl, srcImage.getWidth(), srcImage.getHeight());
        }

    }

    /**
     * 图像缩放 jpg格式
     *
     * @param imgsrc
     *            :原图片文件路径
     * @param imgdist
     *            :生成的缩略图片文件路径
     * @param widthdist
     *            :生成图片的宽度
     * @param heightdist
     *            :生成图片的高度
     */
    public static void reduceImg(String imgsrc, String imgdist, int widthdist,
            int heightdist) {
        try {
            File srcfile = new File(imgsrc);
            if (!srcfile.exists()) {
                return;
            }
            Image src = ImageIO.read(srcfile);

            BufferedImage tag = new BufferedImage((int) widthdist,
                    (int) heightdist, BufferedImage.TYPE_INT_RGB);
            /*
             * Image.SCALE_SMOOTH 的缩略算法  生成缩略图片的平滑度的
             * 优先级比速度高 生成的图片质量比较好 但速度慢
             */
            tag.getGraphics().drawImage(
                    src.getScaledInstance(widthdist, heightdist,
                    Image.SCALE_SMOOTH), 0, 0, null);

            FileOutputStream out = new FileOutputStream(imgdist);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(tag);
            out.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public static void reduceImgGif(String imgsrc, String imgdist, int widthdist,
            int heightdist) {
        try {
            File srcfile = new File(imgsrc);
            if (!srcfile.exists()) {
                return;
            }
            Image src = ImageIO.read(srcfile);

            BufferedImage tag = new BufferedImage((int) widthdist,
                    (int) heightdist, BufferedImage.TYPE_INT_RGB);
            /*
             * Image.SCALE_SMOOTH 的缩略算法  生成缩略图片的平滑度的
             * 优先级比速度高 生成的图片质量比较好 但速度慢
             */
            tag.getGraphics().drawImage(
                    src.getScaledInstance(widthdist, heightdist,
                    Image.SCALE_SMOOTH), 0, 0, null);

            //          FileOutputStream out = new FileOutputStream(imgdist);
            //          JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            //          encoder.encode(tag);
            //          out.close();
            ImageIO.write(tag, "gif", new File(imgdist));

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 根据图片路径 读取图片文件
     * @param fileName
     * @return
     */
    public static BufferedImage readImage(String fileName) {
        BufferedImage bi = null;
        try {
            bi = ImageIO.read(new File(fileName));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return bi;
    }

    /**
     * 生成新的图片文件
     * @param im
     * @param formatName
     * @param fileName
     * @return
     */
    public static boolean writeImage(RenderedImage im, String formatName,
            String fileName) {
        boolean result = false;
        try {
            result = ImageIO.write(im, formatName, new File(fileName));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return result;
    }

    /**
     * 转换图片格式 到 jpg
     * @param im
     * @param fileName
     * @return
     */
    public static boolean writeJPEGImage(RenderedImage im, String fileName) {
        return writeImage(im, "JPEG", fileName);
    }

    /**
     * 转换图片格式 到 gif  不知到好用不
     * @param im
     * @param fileName
     * @return
     */
    public static boolean writeGIFImage(RenderedImage im, String fileName) {
        return writeImage(im, "GIF", fileName);
    }

    public static boolean writePNGImage(RenderedImage im, String fileName) {
        return writeImage(im, "PNG", fileName);
    }

    public static boolean writeBMPImage(RenderedImage im, String fileName) {
        return writeImage(im, "BMP", fileName);
    }
}
